package logicaPresentacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JOptionPane;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

import logicaNegocio.Asignatura;
import logicaNegocio.GestionAdministrador;
import logicaNegocio.GestionAlumnos;
import logicaNegocio.GestionProfesores;


public class VerAsignaturas extends JInternalFrame implements ActionListener, Observer
{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private GestionAdministrador gAd;
	private GestionAlumnos gA;
	private GestionProfesores gP;
	private JTable tbAsignaturas;
	private String eleccion, dni;		
	private TablaAsignatura tabla = null;
	private JScrollPane scrollPane; 
	private JPanel jpBotones;
	private JButton aceptar, cancelar, borrar;
	private ClaseAObservar observable;
	private ArrayList <Asignatura> asignaturas;
	private Asignatura a;
	
	public VerAsignaturas (GestionAdministrador gAd,GestionAlumnos gA, GestionProfesores gP, String eleccion, String dni, ClaseAObservar observable)
		{
			
			super("Asignaturas", 
		              true, 
		              false, 
		              true, 
		              true);
			setVisible(true);

			setSize(800,300);
			
			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			this.inicializarSubComponentes();
			this.eleccion = eleccion;
			this.dni= dni;
			this.gAd = gAd;
			this.gA = gA;
			this.gP = gP;
			this.observable = observable;
			blnCargarFormulario();
		}
	public boolean blnCargarFormulario()
	{
		boolean blnResultado=true;
		
		crearTablaAsignatura();
		
		this.setLocation(200,200);
		this.setVisible(true);
		inicializarSubComponentes();
	
		return blnResultado;
	}
	
	public void crearTablaAsignatura()
	{
		tabla=new TablaAsignatura();
		tbAsignaturas=null;
		
		if (eleccion == "ID_Asignaturas"||(eleccion == "Numero de Creditos")||(eleccion == "Borrar")||(eleccion == "Por nombre de la Asignatura"))
		{
			tabla.crearTabla(gAd.getAsignaturas());
		}
		if (eleccion == "Alumno")
		{
			tabla.crearTabla(gA.getAsignaturas());
		}
		if (eleccion == "Profesor")
		{
			tabla.crearTabla(gP.getAsignaturas());
		}
		tbAsignaturas = new JTable(tabla);
		tbAsignaturas.setPreferredScrollableViewportSize(new Dimension(500, 70));
		tbAsignaturas.setFillsViewportHeight(true);
		tbAsignaturas.setEnabled(true);
		tbAsignaturas.setRowSelectionAllowed(true);
		tabla.fireTableDataChanged();
				
	}	
	public void inicializarSubComponentes()
	{		
		try
		{
			scrollPane= new JScrollPane(tbAsignaturas);

			this.getContentPane().setLayout(new BorderLayout());
	        this.getContentPane().add(scrollPane,"Center");
	        
	        Box boxbotones;
	        if(eleccion.equals("Borrar"))
	        {
	        	borrar=new JButton("Borrar");
	        	borrar.addActionListener(this);
				cancelar=new JButton("Cancelar");
				cancelar.addActionListener(this);
		      
		        boxbotones = Box.createHorizontalBox();
		        boxbotones.add(borrar);
		        Box.createHorizontalStrut(20);
		        boxbotones.add(cancelar);
		        
		        jpBotones=new JPanel();
				jpBotones.setLayout(new FlowLayout());
				jpBotones.add(boxbotones);
	        }
	        else
	        {
	        
		        aceptar=new JButton("Aceptar");
				aceptar.addActionListener(this);
				jpBotones=new JPanel();
				jpBotones.setLayout(new FlowLayout());
				jpBotones.add(aceptar);
	        }
							
			this.getContentPane().add(jpBotones,"South");
		}
		catch(Exception e)
		{		
		}
		
	}
		
	public void actionPerformed(ActionEvent e)
	{	
		if (e.getSource() instanceof JButton) 
		{
			JButton btnPulsado=(JButton)e.getSource();

			if ((btnPulsado==aceptar)||(btnPulsado==cancelar)) 
			{
				dispose();
			}
			if(btnPulsado==borrar)
			{
				int row = tbAsignaturas.getSelectedRow();
				if(row>=0)
				{
					asignaturas = gAd.getAsignaturas();
					
					a = asignaturas.get(row);//4 es el dni
					gAd.borrarAsignatura(a);

					observable.setTabla();
					
					JOptionPane.showMessageDialog(null, "Tupla Borrada");
					dispose();
				}
				else
				{
					JOptionPane.showMessageDialog(null, "Debe seleccionar una fila si quiere borrar una tupla");          
				}
			}	
		}
	}

	public void update(Observable arg0, Object arg1)
	{
		tbAsignaturas=null;
		tabla.crearTabla(gAd.getAsignaturas());
		tbAsignaturas = new JTable(tabla);
		tbAsignaturas.setPreferredScrollableViewportSize(new Dimension(500, 70));
		tbAsignaturas.setFillsViewportHeight(true);
		tbAsignaturas.setEnabled(true);
		tbAsignaturas.setRowSelectionAllowed(true);
		tabla.fireTableDataChanged();		
	}

	class TablaAsignatura extends AbstractTableModel
    {
 		/**
 		 * 
 		 */
		private static final long serialVersionUID = -5513982177874662412L;
		private	String[] columnNames = {"Nombre de la Asignatura","Numero de Creditos", "Breve Explicacion"};
	    private Object[][] data;
        
        public void crearTabla(ArrayList<Asignatura> asignaturas)
        {
    		
        	if (eleccion == "ID_Asignaturas"||(eleccion == "Numero de Creditos")||(eleccion == "Borrar")||(eleccion == "Por nombre de la Asignatura"))
    		{
    			String[] column = {"ID_Campus","Nombre de la Asignatura","Numero de Creditos", "Caracteristicas del grado"};
	    		int filas = asignaturas.size();
		    	data=new Object[filas][];
		    	
		    	if (eleccion == "Numero de Creditos")
	    		{
		    		asignaturas = gAd.ordenarAsignaturas(asignaturas);
	    		}
		    	if (eleccion == "Por nombre de la Asignatura")
	    		{
		    		System.out.print("66");
		    		asignaturas = gAd.ordenarAsignaturasNombre(asignaturas);
	    		}
		    	
	    		for (int cont = 0;  cont<asignaturas.size();cont++)
	    		{
	    			Asignatura as = (Asignatura) asignaturas.get(cont);
	    			Object[]a={
	    					   new String(Integer.toString(as.getID())),
	    					   new String(as.getNombreAsignatura()),
	    					   new Integer(as.getNumeroCreditos()),
	    					   new String(as.getCaracteristicasAsignatura()),
	    			};
	    			data[cont]=a;
	    		}
	    		columnNames = column;
    		}
    		
    		if (eleccion.equals("Alumno"))
    		{
    			if(gA.getNoAsignaturas(dni)>0)
    			{
	    			int cont = gA.getNoAsignaturas(dni);
	
		    		data=new Object[cont][];
	    			int [] noAsignaturas =  gA.toStringAsignaturas(dni, cont);
	    			
	    			for (int i = 0 ; i<noAsignaturas.length; i++)
		    		{
	    				Asignatura as = (Asignatura) asignaturas.get(noAsignaturas[i]);
		    			Object[]a={
		    					   new String(as.getNombreAsignatura()),
		    					   new Integer(as.getNumeroCreditos()),
		    					   new String(as.getCaracteristicasAsignatura()),
		    			};
		    			data[i]=a;
		    		} 
    			}
    			else
    			{
    				JOptionPane.showMessageDialog(null, "No tienes asignaturas");
    			}
    		}
    	
    		if (eleccion.equals("Profesor"))
    		{
    			int cont = gP.getNoAsignaturas(dni);

	    		data=new Object[cont][];
    			int [] noAsignaturas =  gP.toStringAsignaturas(dni, cont);
    			
    			for (int i = 0 ; i<noAsignaturas.length; i++)
	    		{
    				Asignatura as = (Asignatura) asignaturas.get(noAsignaturas[i]);
	    			Object[]a={
	    					   new String(as.getNombreAsignatura()),
	    					   new Integer(as.getNumeroCreditos()),
	    					   new String(as.getCaracteristicasAsignatura()),
	    			};
	    			data[i]=a;
	    		} 
    		}
        }
        
       public int getColumnCount() 
        {
            return columnNames.length;
        }

        public int getRowCount() 
        {
            return data.length;
        }

        public String getColumnName(int col) 
        {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) 
        {
            return data[row][col];
        } 
    }
}
